/**   
 * @Copyright:  成都北诺星科技有限公司  All rights reserved.Notice 官方网站：http://www.beinuoxing.com
 */
package com.zhihuixingguang.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;


/**
 * 字符串相关工具类
 * @author wangmingwei
 *
 */
public abstract class StringUtils {

	public static final String EMPTY_STRING = "";
	
	public static final String NUMBER_REGEX = "^(\\-|\\+)?\\d+(\\.\\d+)?$";
	public static final String TEL_REGEX = "^((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?$";
	public static final String MOBILE_REGEX = "^1[0-9]{10}$";
	public static final String ID_CARD_REGEX_15 = "^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$";
	public static final String ID_CARD_REGEX_18 = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
	public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
	public static final String WEBSITE_REGEX = "^([hH][tT]{2}[pP]:/*|[hH][tT]{2}[pP][sS]:/*|[fF][tT][pP]:/*)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+(\\\\?{0,1}(([A-Za-z0-9-~]+\\\\={0,1})([A-Za-z0-9-~]*)\\\\&{0,1})*)$";
	
	
	/**
	 * 获取随机字符串
	 * @param length
	 * @return
	 */
	public static String getNonceStr(int length){
		String string = "qwertyuioplkjhgfdsazxcvbnm123456789POIUYTREWQASDFGHJKLMNBVCXZ";
		StringBuffer sb = new StringBuffer();
	    int len = string.length();
	    for (int i = 0; i < length; i++) {
	        sb.append(string.charAt((int) (Math.random()*len)));
	    }
	    return sb.toString();
	}
	/**
	 * 检测string 是否为空
	 * <pre>
     * StringUtils.isBlank(null)      = true
     * StringUtils.isBlank("")        = true
     * StringUtils.isBlank(" ")       = true
     * StringUtils.isBlank("bob")     = false
     * StringUtils.isBlank("  bob  ") = false
     * </pre>
	 * @param string
	 * @return
	 */
	public static boolean isBlank(String string){
		return !isNotBlank(string);
	}
	
	/**
	 * 检测string 是否不为空
	 * @param string
	 * @return
	 * 		!isBlank(string)
	 */
	public static boolean isNotBlank(String string){
		if(string == null || string.isEmpty()) return false;
		return !string.trim().isEmpty();
	}
	
	/**
	 * 校验是否是网址
	 * @param url
	 * @return
	 * 		 true 是  false 否
	 */
	public static boolean isUrl(String url){
		return pattern(WEBSITE_REGEX, url) || url.startsWith("http://") || url.startsWith("https://");
	}
	
	public static boolean pattern(String regex,String str) {
		if(isBlank(str)) return false;
		Pattern pattern = Pattern.compile(regex);
		return pattern.matcher(str).matches();
	}

	/**
	 * 将集合转换成字符串
	 * @param collection  集合，可为空。
	 * @param split
	 * 			拼接字符串，如：','等
	 * @return
	 */
	public static String listToString(Collection<?> collection, String split) {
		StringBuffer result = new StringBuffer();
		if(collection == null || collection.isEmpty()) {
			return EMPTY_STRING;
		}
		int i = 0;
		for (Object o : collection) {
			i++;
			result.append(o);
			if(i < collection.size()) {
				result.append(split);
			}
		}
		return result.toString();
	}

	/**
	 * 将集合拼接成字符串
	 * @param collection
	 * 			待处理的集合
	 * @param split
	 * 			拼接的中间字符。如：','等
	 * @return
	 */
	public static String join(Collection<?> collection,String split) {
		return join(collection, split, null, null);
	}

	/**
	 * 将集合拼接成字符串，如join([1,2,3,4,5],',','[',']');则返回的是：'[1],[2],[3],[4],[5]'
	 * @param collection
	 * 			集合
	 * @param split
	 * 			拼接的中间字符，如：','等
	 * @param prefix
	 * 			拼接字符串前缀。会在每一个值前面加上前缀。
	 * @param suffix
	 * 			拼接字符串后缀。会在每一个值前面加上后缀。
	 * @return
	 */
	public static String join(Collection<?> collection, String split, String prefix, String suffix) {
		if(collection == null) return null;
		Iterator<?> iterator = collection.iterator();
		StringBuffer sb = new StringBuffer();
		if(prefix != null) sb.append(prefix);
		sb.append(iterator.next());
		if(suffix != null) sb.append(suffix);
		while (iterator.hasNext()) {
			sb.append(split);
			if(prefix != null) sb.append(prefix);
			sb.append(iterator.next());
			if(suffix != null) sb.append(suffix);
		}
		return sb.toString();
	}

	/**
	 * 随机产生i位字符串，不包含符号
	 * @param i
	 * @return
	 */
	public static String randomStr(int i) {
		if(i <= 0) return null; 
		String str = "1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuioplkjhgfdsazxcvbnm";
		char[] chars = str.toCharArray();
		char[] result = new char[i];
		for (int j = 0; j < i; j++) {
			result[j] = chars[(int) (Math.random()*chars.length)];
		}
		return String.valueOf(result);
	}

	/**
	 * 将字符串转换为list
	 * @param str
	 * 			待转换的字符串
	 * @param split
	 * 			分隔符
	 * @param filterEmpty
	 * 			过滤为空的字符串，使用isNotBlank判断
	 * @return
	 */
	public static List<String> string2List(String str, String split, boolean filterEmpty) {
		List<String> list = new ArrayList<String>();
		if(isBlank(str) || isBlank(split)) return list;
		String[] ss = str.split(split);
		for (String s : ss) {
			if(filterEmpty) {
				if(isNotBlank(s)) {
					list.add(s.trim());
				}
			} else {
				list.add(s);
			}
		}
		return list;
	}

	/**
	 * 将字符串数字转换成字符串
	 * @param title
	 * @param split
	 * 			分隔符
	 * @return
	 */
	public static String join(String[] title, String split) {
		return join(Arrays.asList(title), split);
	}



	/**
	 * 校验字符串是否是邮箱
	 * @param str
	 * @return
	 */
	public static boolean isEmail(String str) {
		return pattern(EMAIL_REGEX, str);
	}

	/**
	 * 校验是否是身份证号
	 * @param str
	 * @return
	 */
	public static boolean isIdCard(String str) {
		if(isBlank(str)) return false;
		if(str.length() != 15 && str.length() != 18) return false;
		return pattern(ID_CARD_REGEX_18, str) || pattern(ID_CARD_REGEX_15, str);
	}

	/***
	 * 校验是否是手机号或固话号码
	 * @param str
	 * @return
	 */
	public static boolean isMobilePhone(String str) {
		return isMobile(str) || isTel(str);
	}

	/**
	 * 检测是否是固话
	 * @param str
	 * @return
	 */
	public static boolean isTel(String str) {
		return pattern(TEL_REGEX, str);
	}

	/**
	 * 检测是否是手机号码
	 * @param str
	 * @return
	 */
	public static boolean isMobile(String str) {
		if(isBlank(str)) return false;
		if(str.length() != 11) return false;
		return pattern(MOBILE_REGEX, str);
	}

	/**
	 * 是否是数字
	 * @param str
	 * @return
	 */
	public static boolean isNumber(String str) {
		return pattern(NUMBER_REGEX, str);
	}
}
